package scales.xml.equals
import scales.xml.{PullType, Text, CData, PI, Comment}
class JoinTextAndCData( var it : Iterator[PullType], val keepCData : Boolean = false) extends Iterator[PullType] {
var gotNext = false
var item : PullType = _
var nextIsNonText = false
var nonText : PullType = _
var sb : java.lang.StringBuilder = _
def hasNext = gotNext
def next = {
if (!gotNext) throw new java.util.NoSuchElementException("No more data to give")
var i = item
pumpNext
i
}
def pumpNext {
if (nextIsNonText) {
nextIsNonText = false
item = nonText
gotNext = true
return
}
gotNext = false
var inText = false
def addText( str : String ) {
if (!inText) {
inText = true
sb = new java.lang.StringBuilder()
}
sb.append(str)
}
while( !gotNext && it.hasNext) {
item = it.next
item match {
case Left(x : Text) => addText(x.value)
case Left(x : CData) if (!keepCData) => addText(x.value)
case x : PullType =>
if (inText) {
nextIsNonText = true
nonText = item
item = Left(Text(sb.toString))
} else {
nextIsNonText = false
}
gotNext = true
}
}
}
pumpNext
}
object LogicalFilters {
def joinTextAndCData( it : Iterator[PullType] ) : Iterator[PullType] =
new JoinTextAndCData(it)
def joinText( it : Iterator[PullType] ) : Iterator[PullType] =
new JoinTextAndCData(it, true)
def removePIAndComments( it : Iterator[PullType] ) : Iterator[PullType] =
it.filter{
case Left(_ : PI) | Left(_ : Comment) => false
case _ => true
}
}
<iframe src="https://scalesxml.github.io/scales-xml_2.10/0.5.0/api.sxr/scales/xml/equals/LogicalComparisons.scala.html" width="1280" height="720" frameborder="0"> </iframe>